<!DOCTYPE html>
<html>

<head>
  <title>Ennovative Solutions uses Quarkus with AWS Lambda to deliver a better customer experience with their new product PURQR</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/blog/ennovativesolutions-uses-quarkus-with-aws-lambda/" />
  <meta property="og:title" content="Ennovative Solutions uses Quarkus with AWS Lambda to deliver a better customer experience with their new product PURQR" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/blog/ennovativesolutions-uses-quarkus-with-aws-lambda/">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="post">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="active">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="post-page grid-wrapper">
  <div class="width-8-12 width-12-12-m doc-content">
    <div class="grid-wrapper">
      <div class="width-12-12">
        <p>
          <a href="/blog"><i class="fas fa-angle-left"></i> Back to all posts</a>
        </p>
      </div>
      <div class="width-12-12">
        <div class="post-date">
          March 14, 2020 
          
            <span class="tags"><a href="/blog/tag/user-story">#user-story</a></span>
          
        </div>
        <h1 class="post-title">Ennovative Solutions uses Quarkus with AWS Lambda to deliver a better customer experience with their new product PURQR</h1>
        <div class="grid-wrapper">
          <div class="width-8-12 width-12-12-m byline-wrapper">
            
            
              <img class="headshot" src="https://www.gravatar.com/avatar/33c2cb775850e595c2dc1dedd88ef98d">
            
            <p class="byline">By Cesar Saavedra</p>
          </div>
          <div class="width-12-12">
              <div id="preamble">
<div class="sectionbody">
<div class="imageblock customer-logo">
<div class="content">
<img src="/assets/images/posts/quarkus-user-stories/ennovativesolutions/ennovativesolutions-purqr.png" alt="EnnovativeSolutions logo" width="300">
</div>
</div>
<div class="paragraph">
<p><a href="https://www.ennovative-solutions.be/">Ennovative Solutions</a> is an IT Consulting and Services company out of Diepenbeek, Belgium. By working with many customers, including ones in retail, they identified that many of them were suffering low sales due to poor customer experience. As a result, in 2019, they created a new application called <a href="https://www.purqr.com/?fbclid=IwAR2nSQcVWEOEIiL0XLva4IAkjJWmehU8FdS2YtMAwpC1jFdflGbvmmmOwT8">PURQR</a> (Purchasing via QR codes), which is a new cloud platform that comes with both a backend application and a mobile application to manage retailers’ physical store showrooms. By using the mobile app, one can perform in store analytics, e.g. popular products &amp; categories, best performing salespersons, etc., and deliver a more personalized experience to end customers. The platform also manages appointments and customer data so when they leave the showroom they can receive an overview of what they liked via mail. In addition, PURQR integrates to customers’ quoting systems. For example, one of its goals is to provide customers with a more personalized follow-up quote to turn it into a sale. The solution also keeps customer information for further communication and possible co-sale and up-sale opportunities. Because one scans the products as part of its processes, one can get insights into popular products that the company can then stock up on.  Their cloud platform can improve customer experience and also increase sales.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="their-journey-into-quarkus"><a class="anchor" href="#their-journey-into-quarkus"></a>Their journey into Quarkus</h2>
<div class="sectionbody">
<div class="paragraph">
<p>For the development of PURQR, Ennovative Solutions decided to follow a Function-as-a-Service approach by using AWS Lambda as the serverless computing platform. When Dennis Baerten, Software Engineer with Ennovative Solutions, started his journey using AWS Lambda, he described it as <em>“I ran into the long startup times using regular Java in AWS Lambda”.</em> They soon realized that using plain Java on this serverless computing platform was not going to deliver the performance and experience that they were after. This is when they started to look at other options.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="from-micronaut-to-quarkus"><a class="anchor" href="#from-micronaut-to-quarkus"></a>From Micronaut to Quarkus</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A colleague of Dennis’ told him to look at Micronaut, which is another framework that supports GraalVM. He tried out Micronaut but encountered difficulties getting it to work with the type of application he was building. Furthermore, there was no Micronaut plugin to build his native image in AWS. <em>“Quarkus had more features and extensions than Micronaut that could be compiled to native (compatible with GraalVM)”,</em> Dennis asserted. When he got started with Quarkus, one of the first things Dennis did was to enroll himself to the Quarkus Zulip channel. Dennis engaged and connected with the Quarkus community and obtained quick replies to his questions and even found some bugs in Quarkus. He was even able to apply the fixes himself via GitHub Pull Requests, which were eventually merged into the Quarkus project. Dennis expressed <em>“I valued and was very pleased with the support from the Quarkus community, which is very active”.</em> In addition, the fact that Red Hat was behind Quarkus was also important to Dennis. He was familiar with Hibernate and other open source technologies that are sponsored by Red Hat. He knew Red Hat was a big player in the IT world so knowing this gave Dennis the confidence in the technology. Knowing that Red Hat was a sponsor of Quarkus, reassured him about his decision to use it to implement his application.</p>
</div>
<div class="paragraph">
<p>Ennovative Solutions had tried Micronaut during the proof of concept phase. However, after learning about Quarkus and its benefits over Micronaut, they migrated everything to Quarkus. In their opinion, some of these benefits included:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Great support via Zulip</p>
</li>
<li>
<p>Ability to directly contribute to the project</p>
</li>
<li>
<p>Fast innovation</p>
</li>
<li>
<p>Fast project release cadence that provides quick bug fixes and new features</p>
</li>
<li>
<p>Quarkus is following closely what happens with GraalVM</p>
</li>
<li>
<p>Quarkus is a hot topic and innovative technology that is talked about a lot at Java conferences</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="purqr-high-level-architecture"><a class="anchor" href="#purqr-high-level-architecture"></a>PURQR high-level architecture</h2>
<div class="sectionbody">
<div class="paragraph">
<p>PURQR consists of 7 Quarkus microservices that are currently running in production. They have been in production since October 2019.</p>
</div>
<div class="paragraph">
<p>Most of the microservices are HTTP-based and sit behind an Amazon API Gateway and at the backend they are all AWS Lambda functions. These microservices are:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>External product view - viewing capabilities for products for the end consumer</p>
</li>
<li>
<p>Product repository - this is where information about products reside</p>
</li>
<li>
<p>Company settings - interface to set company wide parameters</p>
</li>
<li>
<p>Appointments - customer appointments functionality</p>
</li>
<li>
<p>Label generation - capabilities for generating Dymo labels</p>
</li>
<li>
<p>Notifications - SQS consumer for asynchronous emails</p>
</li>
<li>
<p>Summary - aggregates all the data to display on the dashboard for the business owner</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Here’s a high-level pictorial of the PURQR system that uses Quarkus with AWS Lamdba:</p>
</div>
<div class="imageblock purqr-architecture">
<div class="content">
<img src="/assets/images/posts/quarkus-user-stories/ennovativesolutions/purqr-architecture.png" alt="PURQR high-levelArch" width="1000">
</div>
</div>
<div class="paragraph">
<p>As depicted in the logical architecture diagram above, the Quarkus-based microservices all run as AWS Lambda functions. It is worth mentioning that all these microservices run in test and production in Quarkus native mode, which leverages GraalVM native image. For local development and debugging purposes, they run these microservices in Quarkus JVM mode using <a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html">AWS Serverless Application Model</a> (SAM) on their local machines.</p>
</div>
<div class="paragraph">
<p>Lastly, <em>“moving to Quarkus was easy.  Getting everything to work in native mode took a couple of days. And it took about two months to develop the complete application”,</em> added Dennis.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="quarkus-benefits"><a class="anchor" href="#quarkus-benefits"></a>Quarkus benefits</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ennovative Solutions found Quarkus to be a very valuable and rich Java stack with a wide range of capabilities to implement any type of business application. Among the many benefits that Quarkus provided to them, running Java applications in AWS Lambda functions without the downside of cold starts was one of them. Quarkus fast startup time was key here because they wanted to reduce the cold start timing of AWS Lambda functions to a bare minimum when running in both test and production environments. For example, <em>“using Spring with AWS Lambda would have been prohibitive because the startup time of Spring in AWS Lambda is too big from my research”,</em> Dennis mentioned ( <a href="https://keyholesoftware.com/2018/04/26/aws-lambda-with-spring-boot/">1</a> , <a href="https://dzone.com/articles/aws-lambda-with-spring-boot">2</a> , <a href="https://pattern-match.com/blog/2019/07/11/springboot2-and-aws-lambda-quick-fix/">3</a> ). Also, from past experience, he had seen that <em>“using plain Java with AWS Lambda, it was taking 6 to 7 seconds for a cold startup whereas with Quarkus it takes about 200 milliseconds”,</em> Dennis added. However, in order to be more thorough in his research, he took one of the simplest functions (no dependency injection, logging) he had and ran it in AWS Lambda in plain Java and Quarkus native mode, the latter being a combination of Quarkus + GraalVM native image. The measurements, as reported by the AWS Lambda platform, are as follows:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 1. Quarkus with AWS Lambda - measurements</caption>
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Metric name</th>
<th class="tableblock halign-center valign-top">Plain Java</th>
<th class="tableblock halign-center valign-top">Quarkus native mode</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Cold start time (ms)</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">584.13</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">222.07</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Execution time (ms)</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">76.12</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">6.67</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Memory consumed (MB)</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">102</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">72</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>In the table above, you can see a 62% reduction in cold start from plain Java to Quarkus native and a 91% reduction in execution time from plain Java to Quarkus native mode!  For memory consumption, there was a 29% reduction in going from plain Java to Quarkus native.</p>
</div>
<div class="paragraph">
<p>By using Quarkus with AWS Lambda, Ennovative Solutions have been able to lower the cloud resource consumption costs, which include the use of AWS Lambda, SQS, DynamoDB, Route53, among others. Presently, PURQR has a handful of customers so their monthly costs are minimal. However, Dennis mentions that as their number of customers grows so will their cloud resource consumption costs.  <em>“As these costs increase, this is when the benefit of using Quarkus will be experienced due to its more efficient use of cloud resources and fast startup time compared to plain Java and Spring Boot”,</em> Dennis stated.</p>
</div>
<div class="paragraph">
<p>As a Spring developer, Dennis found Quarkus very easy to learn. He mentioned <em>“it took me about 3 days to get familiar with the Quarkus stack”.</em> In fact, he highlighted that the fast learning curve attracted him to Quarkus as well. He was also particularly impressed by the Quarkus documentation, which <em>"is very good",</em> he added. Dennis thinks the Quarkus guides are very thorough and provide good detailed information. This is another reason why he selected Quarkus.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="lessons-learned"><a class="anchor" href="#lessons-learned"></a>Lessons Learned</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Quarkus can run in JVM mode and native mode. If you are interested in running your application in Quarkus native mode, Dennis recommends to first check if Quarkus offers extensions for your required functional requirements. For example, if you’d like to access an in-memory-data-grid (IMDG) like Kafka, he suggests you first search the Quarkus extensions to see if there’s any extension related to this need. Quarkus extensions can compile to native so it’s better to check if Quarkus offers your required functionality before you start implementing your application with a library for which Quarkus does not provide an extension. If you don’t find a Quarkus extension for the third-party library you want to use, then Dennis recommends to check the Quarkus project issues to see if there’s already a pending request to “quark” the third-party library. Also, you’d want to check with the third-party library authors/project to see if they already have a Quarkus extension or are working on one.  You don’t want to find out that you can’t compile your application to a native executable after you have spent hours developing it! You want to avoid this if your goal is to compile to native. In short, the lesson learned here is <em>“check first if there are Quarkus extensions available for what you need”</em>, Dennis suggests.</p>
</div>
<div class="paragraph">
<p>They were not able to use live coding with Quarkus because this capability does not currently support AWS Serverless Application Model (SAM) for the AWS Lambda functions running on their local machines.</p>
</div>
<div class="paragraph">
<p>Lastly, although learning Quarkus was fast, learning the internals of Quarkus native mode was more challenging and took longer to understand.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-future"><a class="anchor" href="#the-future"></a>The future</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ennovative Solutions plans to continue using Quarkus for future development of PURQR as well as other solutions. They are extremely impressed by this new technology and the involvement and active participation of its community. About the Quarkus project, Dennis’s parting thoughts are <em>“Great job! Keep up the good work and continue accepting work from the community.”</em></p>
</div>
<div class="paragraph">
<p>For more information on Quarkus:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Quarkus website: <a href="http://quarkus.io" class="bare">http://quarkus.io</a></p>
</li>
<li>
<p>Quarkus GitHub project: <a href="https://github.com/quarkusio/quarkus" class="bare">https://github.com/quarkusio/quarkus</a></p>
</li>
<li>
<p>Quarkus Twitter: <a href="https://twitter.com/QuarkusIO" class="bare">https://twitter.com/QuarkusIO</a></p>
</li>
<li>
<p>Quarkus chat: <a href="https://quarkusio.zulipchat.com/" class="bare">https://quarkusio.zulipchat.com/</a></p>
</li>
<li>
<p>Quarkus mailing list: <a href="https://groups.google.com/forum/#!forum/quarkus-dev" class="bare">https://groups.google.com/forum/#!forum/quarkus-dev</a></p>
</li>
<li>
<p><a href="https://youtube.com/quarkusio">Quarkus YouTube Channel</a></p>
</li>
<li>
<p><a href="https://www.redhat.com/cms/managed-files/cl-4-reasons-try-quarkus-checklist-f19180cs-201909-en.pdf">Four reasons to use Quarkus</a></p>
</li>
</ul>
</div>
</div>
</div>
              
          </div>
          <div class="width-12-12"><div class="share-page">
  <a class="share-linkedin" href="https://www.linkedin.com/shareArticle?mini=true&url=https://quarkus.io/blog/ennovativesolutions-uses-quarkus-with-aws-lambda/&title=Ennovative Solutions uses Quarkus with AWS Lambda to deliver a better customer experience with their new product PURQR" rel="nofollow" target="_blank" title="Share on LinkedIn">
    <img src="/assets/images/share-page/icons_social-linkedin.png"/>
  </a>
  <a class="share-twitter" href="https://twitter.com/intent/tweet?text=Ennovative Solutions uses Quarkus with AWS Lambda to deliver a better customer experience with their new product PURQR&url=https://quarkus.io/blog/ennovativesolutions-uses-quarkus-with-aws-lambda/&via=quarkusio&related=quarkusio" rel="nofollow" target="_blank" title="Share on Twitter">
    <img src="/assets/images/share-page/icons_social-twitter.png"/>
  </a>
  <a class="share-facebook" href="https://facebook.com/sharer.php?u=https://quarkus.io/blog/ennovativesolutions-uses-quarkus-with-aws-lambda/" rel="nofollow" target="_blank" title="Share on Facebook">
    <img src="/assets/images/share-page/icons_social-facebook.png"/>
  </a>
  <a class="share-reddit" href="http://www.reddit.com/submit?url=https://quarkus.io/blog/ennovativesolutions-uses-quarkus-with-aws-lambda/" onclick="window.open(this.href, 'pop-up', 'left=20,top=20,width=900,height=500,toolbar=1,resizable=0'); return false;" title="Share on Reddit" >
    <img src="/assets/images/share-page/icons_social-reddit.png"/>
  </a>
  <a class="share-email" href="mailto:?subject=Ennovative Solutions uses Quarkus with AWS Lambda to deliver a better customer experience with their new product PURQR&amp;body=Ennovative Solutions uses Quarkus with AWS Lambda to deliver a better customer experience with their new product PURQR https://quarkus.io/blog/ennovativesolutions-uses-quarkus-with-aws-lambda/" title="Share via Email" >
    <img src="/assets/images/share-page/icons_social-email.png"/>
  </a>
</div>
</div>
        </div>
      </div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
